package com.lyf.viewapp.list.one;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;

import java.util.HashMap;
import java.util.List;

/**
 * Created by lyf on 2018/4/20 09:52
 *
 * @author lyf
 * desc：实现长按多选adapter,通用Adapter
 */
public class MultiSelectAdapter extends RecyclerView.Adapter<RecyclerHolder> {

    private Context context;
    private List data;

    /**
     * 用来记录是否显示checkBox
     */
    private HashMap<Integer, Integer> isCheckBoxVisible;
    /**
     * 用来记录是否被选中
     */
    private HashMap<Integer, Boolean> isChecked;
    /**
     * 是否处于多选状态
     */
    private boolean isMultiSelect;

    private OtherOnClick click;

    /**
     * 构造
     *
     * @param context       上下文
     * @param data          数据
     * @param isMultiSelect 是否多选
     * @param click         外部监听回调
     */
    public MultiSelectAdapter(Context context, List data, boolean isMultiSelect, OtherOnClick click) {
        this.context = context;
        this.data = data;
        this.click = click;
        this.isMultiSelect = isMultiSelect;
        initData(false);

    }

    private void initData(boolean isCheck) {
        isCheckBoxVisible = new HashMap<>(data.size());
        isChecked = new HashMap<>(data.size());
        // 如果处于多选状态，则显示CheckBox，否则不显示
        if (this.isMultiSelect) {
            for (int i = 0; i < data.size(); i++) {
                isCheckBoxVisible.put(i, CheckBox.VISIBLE);
                isChecked.put(i, isCheck);
            }
        } else {
            for (int i = 0; i < data.size(); i++) {
                isCheckBoxVisible.put(i, CheckBox.INVISIBLE);
                isChecked.put(i, false);
            }
        }
    }

    /**
     * 某一个选中/反选
     * @param position 选中/反选位置
     */
    public void setIsCheckedByPosition(int position) {
        isChecked.put(position, !isChecked.get(position));
        notifyDataSetChanged();
    }

    /**
     * 全选/反选
     * @param isAllSelect 全选/反选标识
     */
    public void setAllChecked(boolean isAllSelect) {
        isMultiSelect = true;
        initData(isAllSelect);
        notifyDataSetChanged();
    }

    /**
     * 退出多选
     */
    public void esc() {
        isMultiSelect = false;
        initData(false);
        notifyDataSetChanged();
    }

    @Override
    public RecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return click.onCreateViewHolder(parent, viewType);
    }

    @Override
    public void onBindViewHolder(RecyclerHolder holder, int position) {
        // 是否显示
        holder.mCheckBox.setVisibility(isCheckBoxVisible.get(position));
        // 是否选中
        holder.mCheckBox.setChecked(isChecked.get(position));
        // 每一个Item的长按事件
        holder.itemView.setOnLongClickListener(new ItemLongClick(position, data));
        holder.itemView.setOnClickListener(new ItemClick(holder, position, isChecked));
        click.showData(holder, position);
        // holder.tvName.setText(null != data.get(position).getName()?data.get(position).getName():"");
    }

    @Override
    public int getItemCount() {
        return data.size();
    }

    /**
     * 自定义点击事件
     */
    class ItemClick implements View.OnClickListener {

        private int position;
        private RecyclerHolder holder;
        private HashMap<Integer, Boolean> isChecked;

        private ItemClick(RecyclerHolder holder, int position, HashMap<Integer, Boolean> isChecked) {
            this.position = position;
            this.holder = holder;
            this.isChecked = isChecked;
        }

        @Override
        public void onClick(View v) {
            click.addOnClickListener(holder, position, isChecked);
        }
    }

    /**
     * 自定义长按事件
     */
    class ItemLongClick implements View.OnLongClickListener {

        private int position;
        private List list;

        /**
         * 获取数据，与长按Item的position
         *
         * @param position position
         * @param list     list
         */
        ItemLongClick(int position, List list) {
            this.position = position;
            this.list = list;
        }

        /**
         * 在长按监听时候，将监听事件返回true
         *
         * @param v 长按的控件
         * @return true
         */
        @Override
        public boolean onLongClick(View v) {
            isMultiSelect = true;
            // 长按点击的item直接设置为选中
            isChecked.put(position, true);
            // 全部的CheckBox为选中
            for (int i = 0; i < list.size(); i++) {
                isCheckBoxVisible.put(i, CheckBox.VISIBLE);
            }
            click.onLongClick(position);
            notifyDataSetChanged();
            return true;
        }
    }

    interface OtherOnClick {
        /**
         * 提供其他监听时事件 长按之后的监听 改变数据等
         *
         * @param position 长按点击的位置
         */
        void onLongClick(int position);

        /**
         * 提供其他监听时事件 长按之后的监听 改变数据等
         *
         * @param position 点击的位置
         * @param holder   点击的holder
         * @param isChecked   isChecked
         */
        void addOnClickListener(RecyclerHolder holder, int position, HashMap<Integer, Boolean> isChecked);

        /**
         * 提供方法回调显示Item数据
         *
         * @param holder   holder对象
         * @param position 显示的位置position
         */
        void showData(RecyclerHolder holder, int position);

        /**
         * 创建ViewHolder 提供RecyclerHolder子类返回
         *
         * @param parent parent
         * @param viewType viewType
         * @return RecyclerHolder
         */
        RecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType);
    }
}
